/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.acionista.view;

import br.jm.acionista.entity.CepBairro;
import br.jm.acionista.entity.CepEndereco;
import br.jm.acionista.sistema.eao.EnderecoEao;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author joao
 */
public class EnderecoBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private CepEndereco selectedEndereco;
    private CepBairro selectedBairro;
    private EnderecoEao enderecoEAO;
    private LazyDataModel<CepEndereco> lazyModelEndereco;
    private String numeroCep;
    private String descLogradouro;
    private String descBairro;
    private String descCidade;
    private String descUf;
    private Map<String, String> pesquisas = new HashMap<String, String>();
    private boolean lPesquisa;
    private boolean disable;
    FacesMessage msg = null;

    public EnderecoBean() {
        selectedEndereco = new CepEndereco();
        enderecoEAO = EnderecoEao.getInstance();

        lPesquisa = false;
        this.disable = true;

        this.lazyModelEndereco = new LazyDataModel<CepEndereco>() {

            public List<CepEndereco> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {
                List<CepEndereco> lazyCepEnderecos = new ArrayList<CepEndereco>();

                try {
                    if (lPesquisa) {
                        first = 0;
                        lPesquisa = false;
                    }
                    lazyCepEnderecos = enderecoEAO.getNative("CepEndereco", first, pageSize, sortField, sortOrder, pesquisas, null);
                    this.setPageSize(pageSize);
                    if (lazyCepEnderecos.isEmpty()) {
                        selectedEndereco = new CepEndereco();
                        selectedEndereco.setDscLogradouro("Nenhum Registro Retornado");
                    }
                } catch (Exception ex) {
                    Logger.getLogger(EnderecoBean.class.getName()).log(Level.SEVERE, null, ex);
                }

                return lazyCepEnderecos;
            }

            @Override
            public int getRowCount() {
                return enderecoEAO.getCount("CepEndereco");
            }
        };

        lazyModelEndereco.setRowCount(enderecoEAO.getCount("CepEndereco"));
    }

    public LazyDataModel<CepEndereco> getLazyModelEndereco() {
        return lazyModelEndereco;
    }

    public void setLazyModelEndereco(LazyDataModel<CepEndereco> lazyModelEndereco) {
        this.lazyModelEndereco = lazyModelEndereco;
    }

    public CepEndereco getSelectedEndereco() {
        if (selectedEndereco == null) {
            selectedEndereco = new CepEndereco();
        }
        return selectedEndereco;
    }

    public void setSelectedEndereco(CepEndereco selectedEndereco) {
        this.selectedEndereco = selectedEndereco;
    }

    public void inserir(ActionEvent actionEvent) {
        msg = null;

        try {
            if (VerificaEndereco()) {
                selectedEndereco.setCodLogradouro(null);

                enderecoEAO.create(selectedEndereco);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Endereco Inserido com Sucesso ", selectedEndereco.getDscLogradouro());
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Inserir: " + selectedEndereco.getDscLogradouro(),
                    e.getMessage());
        } finally {
            selectedBairro = new CepBairro();
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void alterar(ActionEvent actionEvent) {
        msg = null;

        try {
            if (VerificaEndereco()) {
                enderecoEAO.edit(selectedEndereco);
                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Endereco Alterado com Sucesso ", selectedEndereco.getDscLogradouro());
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Alterar: " + selectedEndereco.getDscLogradouro(),
                    e.getMessage());
        } finally {
            selectedBairro = new CepBairro();
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void excluir(ActionEvent actionEvent) {
        msg = null;

        try {
            enderecoEAO.destroy(selectedEndereco);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Endereco Excluido com Sucesso ", selectedEndereco.getDscLogradouro());
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Excluir: " + selectedEndereco.getDscLogradouro(),
                    e.getMessage());
        } finally {
            selectedBairro = new CepBairro();
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void onRowSelectNavigate(SelectEvent event) {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map<String, String> map = facesContext.getExternalContext().getRequestParameterMap();
        try {
            CepBairro bairro = new CepBairro();
            bairro = (CepBairro) event.getObject();

            this.selectedBairro = bairro;

            String cNumCep = map.get("inCep");
            String cDscLogradouro = map.get("inDescricao");

            this.selectedEndereco.setNumCep(cNumCep);
            this.selectedEndereco.setDscLogradouro(cDscLogradouro);
            this.selectedEndereco.setCodBairro(this.selectedBairro);
        } catch (Exception ex) {
            Logger.getLogger(EnderecoBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void PesquisarEndereco(ActionEvent actionEvent) {
        pesquisas.clear();

        if (numeroCep != null) {
            if (!numeroCep.isEmpty()) {
                pesquisas.put("numCep", numeroCep);
            }
        }

        if (descLogradouro != null) {
            if (!descLogradouro.isEmpty()) {
                pesquisas.put("dscLogradouro", descLogradouro);
            }
        }

        if (descBairro != null) {
            if (!descBairro.isEmpty()) {
                pesquisas.put("codBairro.dscBairro", descBairro);
            }
        }

        if (descCidade != null) {
            if (!descCidade.isEmpty()) {
                pesquisas.put("codBairro.codCidade.dscCidade", descCidade);
            }
        }

        if (descUf != null) {
            if (!descUf.isEmpty()) {
                pesquisas.put("codBairro.codCidade.codUf.codUf", descUf);
            }
        }

        lPesquisa = true;
    }

    public String getNumeroCep() {
        return numeroCep;
    }

    public void setNumeroCep(String numeroCep) {
        this.numeroCep = numeroCep;
    }

    public String getDescBairro() {
        return descBairro;
    }

    public void setDescBairro(String descBairro) {
        this.descBairro = descBairro;
    }

    public String getDescCidade() {
        return descCidade;
    }

    public void setDescCidade(String descCidade) {
        this.descCidade = descCidade;
    }

    public String getDescLogradouro() {
        return descLogradouro;
    }

    public void setDescLogradouro(String descLogradouro) {
        this.descLogradouro = descLogradouro;
    }

    public String getDescUf() {
        return descUf;
    }

    public void setDescUf(String descUf) {
        this.descUf = descUf;
    }

    public CepBairro getSelectedBairro() {
        return selectedBairro;
    }

    public void setSelectedBairro(CepBairro selectedBairro) {
        this.selectedBairro = selectedBairro;
    }

    public boolean isDisable() {
        return disable;
    }

    public void setDisable(boolean disable) {
        this.disable = disable;
    }

    public CepEndereco novo() {
        this.disable = false;
        this.selectedBairro = new CepBairro();
        this.selectedEndereco = new CepEndereco();
        this.selectedEndereco.setCodBairro(selectedBairro);

        return this.selectedEndereco;
    }

    public void onRowSelectLogradouro(SelectEvent event) {
        this.selectedEndereco = (CepEndereco) event.getObject();
        this.selectedBairro = this.selectedEndereco.getCodBairro();
        this.disable = true;
    }

    public boolean VerificaEndereco() {
        boolean lReturn = true;

        if (this.selectedEndereco.getNumCep().isEmpty() || this.selectedEndereco.getNumCep().length() < 8) {
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "ATENÇÃO ... Numero C.E.P. incorreto! ", selectedEndereco.getDscLogradouro());
            lReturn = false;
        } else if (this.selectedEndereco.getDscLogradouro().isEmpty()) {
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "ATENÇÃO ... Descrição do Logradouro em Branco! ", selectedEndereco.getDscLogradouro());
            lReturn = false;
        }
        if (selectedBairro != null) {
            selectedEndereco.setCodBairro(selectedBairro);
        } else {
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "ATENÇÃO ... Obrigatório Escolher um Bairro! ", selectedEndereco.getDscLogradouro());
            lReturn = false;
        }
        return lReturn;
    }
}
